home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / bestl232 / examp001.c < prev    next >
C/C++ Source or Header  |  1994-09-11  |  23KB  |  475 lines

  1. /*==========================================================================
  2.  *
  3.  *  EXAMP001.C                                    Sunday, September 11, 1994
  4.  *
  5.  *  Sample source code for The BESTLibrary v2.32.  Demonstrates the use of
  6.  *    the various graphics functions.
  7.  *
  8.  *  Intended to give examples of:
  9.  *    _16_c_need_scrn
  10.  *    _16_c_need_wrst
  11.  *    _16_c_save
  12.  *    _16_c_show
  13.  *    _16_copy
  14.  *    _16_i_need
  15.  *    _16_i_save
  16.  *    _16_i_show
  17.  *    _16_p_need
  18.  *    _16_p_save
  19.  *    _16_p_show
  20.  *
  21.  *  Authored independently by George Vanous
  22.  *  Email any comments, compliments, or suggestions to vanous@helix.net
  23.  *
  24.  *==========================================================================*/
  25.  
  26.  
  27. /* NOTE  if, when you compile, you receive a linker error that states there
  28.          are two undefined symbols "EGAVGA_driver_far" and "small_font_far",
  29.          you need to perform the following steps:
  30.  
  31.       1) go into your BGI subdirectory (where EGAVGA.BGI is located)
  32.       2) type BGIOBJ /F EGAVGA
  33.       3) type BGIOBJ /F LITT
  34.       4) copy the two .OBJs created (EGAVGAF.OBJ and LITTF.OBJ)into the
  35.          same subdirectory as all your libraries (usually LIB\)
  36.       5) type TLIB GRAPHICS.LIB +EGAVGAF +LITTF
  37.  
  38.          this updates your GRAPHICS.LIB file to include the EGAVGA.BGI file
  39.          and the LITT.CHR font (you can do this for all your .BGI and .CHR
  40.          files)
  41. */
  42.  
  43. /* ------------------------------------------------------------------------ */
  44. /* ----------------------------  INCLUDE FILES  --------------------------- */
  45.  
  46. #include <alloc.h>
  47. #include <stdlib.h>
  48. #include <graphics.h>
  49. #include "!bestlib.h"                  /* include !BESTLIB.H in compilation */
  50.  
  51. /* ------------------------------------------------------------------------ */
  52. /* ------------------------------  CONSTANTS  ----------------------------- */
  53.  
  54. #define BGCLR BLUE                              /* background color         */
  55. #define TEXTHEIGHT 12                           /* y-height of printed text */
  56. #define BUFFERSPACE 100                         /* byte size of "buffer"    */
  57. #define DASHES printf("\n--------------------------------------------------------------------------------")
  58. #define PRINT(x, y, text) _16_boxfill(x, y+2, textwidth(text), TEXTHEIGHT-2,\
  59.  BLACK, COPY_IMAGE); outtextxy(x, y, text);     /* prints in graphics mode  */
  60. #define ERR01 "\nI require 400,000 bytes (400kb) of free memory\nBut there is only %ld bytes currently available\n\nDo you want me to continue regardless [y/N] ? "
  61. #define MSG01 "\n\nI suggest you try removing any unnecessary TSRs (Terminate but Stay Resident\nprograms) to increase the amount of available memory.\n\n"
  62.  
  63. /* ------------------------------------------------------------------------ */
  64. /* -------------------------  FUNCTION PROTOTYPES  ------------------------ */
  65.  
  66. void  animate_images(void);                     /* animate images           */
  67. void  begin_sequence(void);                     /* beginning sequence       */
  68. char *color_translate(int color);   /* convert color from integer to string */
  69.          /* restore the background under the text pointed to by "locations" */
  70. void  erase_text(int locations[][3], int number);
  71. void  exit_sequence(void);                      /* exitting sequence        */
  72. void  restore_background(void);                 /* restore the background   */
  73. void  print_image_properties(int x, int y, imagedata *image, char *image_name,
  74. char *image_command, int locations[][3]);       /* print image properties   */
  75. void  save_background(void);                    /* draw and save background */
  76. void  save_images(void);                        /* draw and save images     */
  77. void  show_images(void);                        /* show images onscreen     */
  78. char *t_or_f(int boolean);      /* converts a number into "TRUE" or "FALSE" */
  79.  
  80. /* ------------------------------------------------------------------------ */
  81. /* -------------------------  GLOBAL DEFINITIONS  ------------------------- */
  82.  
  83. /* The following three definition are required by TheBESTLibrary to be
  84.    present, even if they are not all used.  If they are not present, the
  85.    compiler will produce a "linker error". */
  86. asciiscan key;                         /* global structure "key"            */
  87. cursordata cursor;                     /* global structure "cursor"         */
  88. mousedata msdata;                      /* global structure "msdata"         */
  89.  
  90. int oldmode;                           /* old video mode                    */
  91. byte oldcurx, oldcury;                 /* old cursor coordinates            */
  92. char *buffer;                          /* general-purpose text buffer space */
  93. char message[81];    /* 80 bytes + 1 byte for the NULL-terminating
  94.                         character is sufficient to hold the longest message */
  95.  
  96. imagedata *bgscrn[4],                  /* storage area for the background   */
  97.           *image_c[4],                 /* define four compress images       */
  98.           *image_i[2],                 /* define two plane images           */
  99.           *image_p[2];                 /* define two pixel images           */
  100.  
  101. /* ------------------------------------------------------------------------ */
  102.  
  103.  
  104. /*----------------------------------------------------------------------------
  105.  * MAIN SUBROUTINE OF EXAMPLE SOURCE CODE 001
  106.  */
  107. void main(void)
  108. {
  109.   begin_sequence();                          /* perform the begin sequence  */
  110.   save_background();                         /* draw and save background    */
  111.   save_images();                             /* draw and save the images    */
  112.   show_images();                             /* show the images onscreen    */
  113.  
  114.   exit(0);  /* executes the procedure "exit_sequence()" because of the line */
  115.             /* "atexit(exit_sequence)" in procedure "begin_sequence"        */
  116. }
  117.  
  118. /*----------------------------------------------------------------------------
  119.  * Animate the images.
  120.  */
  121. void animate_images(void)
  122. {
  123. /* restore the background under the right three images on the first row     */
  124.    _16_restore_bg(image_c[1]->x,      image_c[1]->y,
  125.                   image_c[1]->length, image_c[1]->height, bgscrn);
  126.    _16_restore_bg(image_c[2]->x,      image_c[2]->y,
  127.                   image_c[2]->length, image_c[2]->height, bgscrn);
  128.    _16_restore_bg(image_c[3]->x,      image_c[3]->y,
  129.                   image_c[3]->length, image_c[3]->height, bgscrn);
  130.  
  131. /* now animate the image on the first row that is left                      */
  132.  
  133. /* restore the background under the right image on the second row           */
  134.    _16_restore_bg(image_p[1]->x,      image_p[1]->y,
  135.                   image_p[1]->length, image_p[1]->height, bgscrn);
  136.  
  137. /* now animate the image on the second row that is left                     */
  138.  
  139. /* restore the background under the right image on the third row            */
  140.    _16_restore_bg(image_i[1]->x,      image_i[1]->y,
  141.                   image_i[1]->length, image_i[1]->height, bgscrn);
  142.  
  143. /* now animate the image on the third row that is left                      */
  144.  
  145. }
  146.  
  147. /*----------------------------------------------------------------------------
  148.  * Beginning sequence.
  149.  */
  150. void begin_sequence(void)
  151. {
  152.   int gdrv = VGA, gmod = VGAHI, error; /* help initialize the graphics mode */
  153.   char ch;                             /* generic character holder          */
  154.   byte i, j;                           /* cursor position holders           */
  155.  
  156.   /* allocate space for a generic string buffer */
  157.   buffer = (char *) malloc(BUFFERSPACE);
  158.  
  159.   /* check amount of available memory */
  160.   DASHES;                              /* print one line of dashes          */
  161.   if (coreleft() < 400000L) {
  162.     sprintf(buffer, ERR01, coreleft());
  163.     fprintf(stderr, buffer);           /* print low memory warning message  */
  164.     cur_get_coord_abs(&i, &j);         /* get the cursor position           */
  165.     while ((ch = case_up(getchre(i, j))) != 'Y' && ch != 'N' && ch != 13) {
  166.       beep();                          /* signal invalid keypress           */
  167.       txt_chr_erase(i, j, 1);          /* erase character                   */
  168.     }
  169.     if (ch != 'Y') {                   /* if 'Y' chosen                     */
  170.       fprintf(stderr, MSG01);          /*   print suggestion message        */
  171.       exit(1);                         /*   exit to DOS with ERRORLEVEL 1   */
  172.     }                                  /* else continue with program        */
  173.   }
  174.  
  175.   fade_out();                          /* fade current text screen to black */
  176.  
  177.   /* initialize The BEST Library and save old video mode
  178.    * set 640x480x16 graphics mode (VGA16) and initialize the mouse (TRUE)   */
  179.   oldmode = bestlib_init(VGA16, TRUE);
  180.  
  181.   /* store that status of the insert, caps, num, and scroll lock */
  182.   kbd_status_save();
  183.  
  184.   atexit(exit_sequence);               /* define the exit procedure         */
  185.  
  186.   /* allocate all necessary memory */
  187.   bgscrn[0] = (imagedata *) malloc(_16_i_need(640, 204));
  188.   bgscrn[1] = (imagedata *) malloc(_16_i_need(640, 204));
  189.   bgscrn[2] = (imagedata *) malloc(_16_i_need(640, 204));
  190.   bgscrn[3] = (imagedata *) malloc(_16_i_need(640, 204));
  191.   image_c[0] = (imagedata *) malloc(_16_c_need_wrst(50, 50));
  192.   image_c[1] = (imagedata *) malloc(_16_c_need_wrst(50, 50));
  193.   image_p[0] = (imagedata *) malloc(_16_p_need(50, 50));
  194.   image_p[1] = (imagedata *) malloc(_16_p_need(50, 50));
  195.   image_i[0] = (imagedata *) malloc(_16_i_need(50, 50));
  196.   if ((image_i[1] = malloc(_16_i_need(50, 50))) == NULL) {
  197.      exit_sequence();                  /* perform the exit sequence         */
  198.      fprintf(stderr, "\nInsufficient free memory to continue\n");
  199.      exit(1);  /* insufficient free memory -- exit to DOS with ERRORLEVEL 1 */
  200.   }    /* only one "if" is necessary because if there is enough memory for
  201.         * the last allocation, there would have been enough for all of the
  202.         * previous allocations                                              */
  203.  
  204.        /* we did check to see that there was at least 400,000 bytes of
  205.           memory available, so the above memory check is unnecessary; it
  206.           is present for the purpose of example                             */
  207.  
  208.   /* setup graphics mode */
  209.   if ((error = registerfarbgidriver(EGAVGA_driver_far)) < 0 ||
  210.       (error = registerfarbgifont(small_font_far)) < 0) {
  211.     fprintf(stderr, "\nGraphics error: %s\n", grapherrormsg(error));
  212.     exit(2);               /* error registering a BGI driver -- exit to DOS */
  213.   }
  214.   initgraph(&gdrv, &gmod, "");
  215.   if ((error = graphresult()) != grOk) {
  216.     fprintf(stderr, "\nGraphics error: %s\n", grapherrormsg(error));
  217.     exit(3);            /* error occurred changing to 640x480x16 video mode */
  218.   }
  219.  
  220.   /* initialize mouse to 640x480x16 graphics mode
  221.    * "mousepresent" = TRUE if mouse is detected, else "mousepresent" = FALSE
  222.   ms_init(VGA16);
  223.   ms_show();                           /* show mouse cursor                 */
  224.    */
  225.  
  226.   _16_floodallall(BGCLR);              /* flood entire video memory         */
  227.   settextstyle(SMALL_FONT, HORIZ_DIR, 4);   /* set default output text font */
  228.   settextjustify(LEFT_TEXT, TOP_TEXT); /* define how text will be written   */
  229. }
  230.  
  231. /*----------------------------------------------------------------------------
  232.  * Return the string representation of an integer-represented color.
  233.  *
  234.  * "color" - integer representation of a color.
  235.  *
  236.  * RETURNS:
  237.  * = name of the color
  238.  * = NULL if unknown color
  239.  */
  240. char *color_translate(int color)
  241. {
  242.    switch(color) {
  243.     case BLACK       : return("BLACK");
  244.     case BLUE        : return("BLUE");
  245.     case GREEN       : return("GREEN");
  246.     case CYAN        : return("CYAN");
  247.     case RED         : return("RED");
  248.     case MAGENTA     : return("MAGENTA");
  249.     case BROWN       : return("BROWN");
  250.     case LIGHTGRAY   : return("LIGHTGRAY");
  251.     case DARKGRAY    : return("DARKGRAY");
  252.     case LIGHTBLUE   : return("LIGHTBLUE");
  253.     case LIGHTGREEN  : return("LIGHTGREEN");
  254.     case LIGHTCYAN   : return("LIGHTCYAN");
  255.     case LIGHTRED    : return("LIGHTRED");
  256.     case LIGHTMAGENTA: return("LIGHTMAGENTA");
  257.     case YELLOW      : return("YELLOW");
  258.     case WHITE       : return("WHITE");
  259.    }
  260.    return(NULL);
  261. }
  262.  
  263. /*----------------------------------------------------------------------------
  264.  * Restore the background under the text pointed to by "locations".
  265.  */
  266. void erase_text(int locations[][3], int number)
  267. {
  268.    register int i;
  269.  
  270.    for (i = 0; i < number; i++)
  271.       _16_restore_bg(locations[i][0], locations[i][1]+2, locations[i][2],
  272.                      TEXTHEIGHT-2, bgscrn);
  273. }
  274.  
  275. /*----------------------------------------------------------------------------
  276.  * Exiting sequence.
  277.  */
  278. void exit_sequence(void)
  279. {
  280.   closegraph();                        /* shut down graphics system         */
  281.   kbd_status_load();
  282.   ms_hide();                           /* hide mouse cursor                 */
  283.   video_restore(oldmode);              /* restore original video status     */
  284.   exit(0);                             /* exit to DOS with ERRORLEVEL 0     */
  285. }
  286.  
  287. /*----------------------------------------------------------------------------
  288.  * Restore the background.
  289.  */
  290. void restore_background(void)
  291. {
  292. /* overwrite the remaining images on the screen to restore the background */
  293.    _16_restore_bg(image_c[0]->x,      image_c[0]->y,
  294.                   image_c[0]->length, image_c[0]->height, bgscrn);
  295.    _16_restore_bg(image_p[0]->x,      image_p[0]->y,
  296.                   image_p[0]->length, image_p[0]->height, bgscrn);
  297.    _16_restore_bg(image_i[0]->x,      image_i[0]->y,
  298.                   image_i[0]->length, image_i[0]->height, bgscrn);
  299. }
  300.  
  301. /*----------------------------------------------------------------------------
  302.  * Print the image properties onscreen.
  303.  *
  304.  * "x","y"      - coordinates of the first line of properties
  305.  * "image"      -
  306.  * "image_name" - string name of the image
  307.  * "image_cmnd" -
  308.  */
  309. void print_image_properties(int x, int y, imagedata *image, char *image_name,
  310.                             char *image_cmnd, int locations[][3])
  311. {
  312.    str_copy(&message[0], image_name);               /* copy "image_name"    */
  313.    str_copy(&message[10], "->size = %d");           /* copy "image->size"   */
  314.    sprintf(buffer, message, image->size);           /* define "buffer"      */
  315.    PRINT(x, y, buffer);                             /* print "buffer"       */
  316.    locations[0][0] = x, locations[0][1] = y,
  317.    locations[0][2] = textwidth(buffer);             /* save text data       */
  318.  
  319.    str_copy(&message[10], "->tclr = %s");
  320.    sprintf(buffer, message, color_translate(image->tclr));
  321.    y += TEXTHEIGHT-1;                               /* adjust y-coordinate  */
  322.    PRINT(x, y, buffer);                             /* print "buffer"       */
  323.    locations[1][0] = x, locations[1][1] = y,
  324.    locations[1][2] = textwidth(buffer);             /* save text data       */
  325.  
  326.    str_copy(&message[10], "->x = %d");
  327.    sprintf(buffer, message, image->x);
  328.    y += TEXTHEIGHT-1;                               /* adjust y-coordinate  */
  329.    PRINT(x, y, buffer);                             /* print "buffer"       */
  330.    locations[2][0] = x, locations[2][1] = y,
  331.    locations[2][2] = textwidth(buffer);             /* save text data       */
  332.  
  333.    str_copy(&message[10], "->y = %d");              /* copy "image->y"      */
  334.    sprintf(buffer, message, image->y);
  335.    y += TEXTHEIGHT-1;                               /* adjust y-coordinate  */
  336.    PRINT(x, y, buffer);                             /* print "buffer"       */
  337.    locations[3][0] = x, locations[3][1] = y,
  338.    locations[3][2] = textwidth(buffer);             /* save text data       */
  339.  
  340.    str_copy(&message[10], "->length = %d");         /* copy "image->length" */
  341.    sprintf(buffer, message, image->length);         /* define "buffer"      */
  342.    y += TEXTHEIGHT-1;                               /* adjust y-coordinate  */
  343.    PRINT(x, y, buffer);                             /* print "buffer"       */
  344.    locations[4][0] = x, locations[4][1] = y,
  345.    locations[4][2] = textwidth(buffer);             /* save text data       */
  346.  
  347.    str_copy(&message[10], "->height = %d");         /* copy "image->height" */
  348.    sprintf(buffer, message, image->height);         /* define "buffer"      */
  349.    y += TEXTHEIGHT-1;                               /* adjust y-coordinate  */
  350.    PRINT(x, y, buffer);                             /* print "buffer"       */
  351.    locations[5][0] = x, locations[5][1] = y,
  352.    locations[5][2] = textwidth(buffer);             /* save text data       */
  353.  
  354.    str_copy(&message[10], "->how = %s");            /* copy "image->how"    */
  355.    sprintf(buffer, message, t_or_f(image->how));    /* define "buffer"      */
  356.    y += TEXTHEIGHT-1;                               /* adjust y-coordinate  */
  357.    PRINT(x, y, buffer);                             /* print "buffer"       */
  358.    locations[6][0] = x, locations[6][1] = y,
  359.    locations[6][2] = textwidth(buffer);             /* save text data       */
  360.  
  361.    str_copy(&message[0], image_cmnd);            /* copy "image_cmnd" */
  362.    y += (TEXTHEIGHT-1)*2;                           /* adjust y-coordinate  */
  363.    PRINT(x, y, message);                            /* print "message"      */
  364.    locations[7][0] = x, locations[7][1] = y,
  365.    locations[7][2] = textwidth(message);            /* save text data       */
  366. }
  367.  
  368. /*----------------------------------------------------------------------------
  369.  * Draw and save the background image.
  370.  */
  371. void save_background(void)
  372. {
  373.    register int i, ii;
  374.  
  375. /* first, draw the border */
  376.    for (i = 0; i < 5; i++)
  377.       _16_boxoutline(i, i, MAXX - i*2, MAXY - i*2, YELLOW, COPY_IMAGE);
  378.  
  379. /* next, draw the background */
  380.    for (i = BLACK, ii = 5; i <= WHITE; i++, ii += 21)
  381.       _16_boxfill(ii, 5, 21, MAXY - 10, i, COPY_IMAGE);
  382.    for (i = YELLOW; i > BLACK; i--, ii += 21)
  383.       _16_boxfill(ii, 5, 21, MAXY - 10, i, COPY_IMAGE);
  384.  
  385. /* and finally, save the background into memory */
  386.    _16_i_save(0, 0,   MAXX, 204, bgscrn[0], FALSE, TRUE);
  387.    _16_i_save(0, 204, MAXX, 204, bgscrn[1], FALSE, TRUE);
  388.    _16_i_save(0, 408, MAXX, 204, bgscrn[2], FALSE, TRUE);
  389.    _16_i_save(0, 612, MAXX, 204, bgscrn[3], FALSE, TRUE);
  390. }
  391.  
  392. /*----------------------------------------------------------------------------
  393.  * Draw and save the images.
  394.  */
  395. void save_images(void)
  396. {
  397. /* draw a simple image offscreen (so as not to disturb the background) */
  398.    _16_boxfill(10, MAXY+10, 50, 50, LIGHTRED, COPY_IMAGE);  /* 50 by 50 box */
  399.    _16_boxfill(20, MAXY+20, 30, 30, LIGHTGREEN, COPY_IMAGE);/* 30 by 30 box */
  400.    _16_boxfill(20, MAXY+30, 30, 10, BLACK, COPY_IMAGE);     /* 30 by 10 box */
  401.    _16_boxfill(30, MAXY+20, 10, 30, BLACK, COPY_IMAGE);     /* draw a hole  */
  402.  
  403. /* allocate memory using "_16_c_need_scrn" (uses compression) */
  404.    image_c[2] = malloc(_16_c_need_scrn(10, MAXY+10, 50, 50));
  405.    image_c[3] = malloc(_16_c_need_scrn(10, MAXY+10, 50, 50));
  406.  
  407. /* save the image in the three available formats */
  408.    _16_c_save(10, MAXY+10, 50, 50, BLACK, image_c[0], FALSE, TRUE);
  409.    _16_c_save(10, MAXY+10, 50, 50, BLACK, image_c[2], FALSE, TRUE);
  410.    _16_p_save(10, MAXY+10, 50, 50, BLACK, image_p[0], FALSE, TRUE);
  411.    _16_i_save(10, MAXY+10, 50, 50,        image_i[0], FALSE, TRUE);
  412.  
  413. /* make copies of the images */
  414.    _16_copy(image_c[1], image_c[0]);         /* copy "c_save" image (wrst)  */
  415.    _16_copy(image_c[3], image_c[2]);         /* copy "c_save" image (scrn)  */
  416.    _16_copy(image_p[1], image_p[0]);         /* copy "p_save" image         */
  417.    _16_copy(image_i[1], image_i[0]);         /* copy "i_save" image         */
  418. }
  419.  
  420. /*----------------------------------------------------------------------------
  421.  * Show the images onscreen.
  422.  */
  423. void show_images(void)
  424. {
  425.    int locations[9][3];      /* a two-dimensional array that will hold x, y */
  426.  
  427. /* show the images (originals and copies) */
  428.    image_c[0]->x = 10,  image_c[1]->x = 100; /* set x-coordinates           */
  429.    image_c[0]->y = image_c[1]->y = 150;      /* set y-coordinates           */
  430.    print_image_properties(10, 10, image_c[0], "image_c[0]",
  431.     "_16_c_show(10, 150, image_c[0])", locations); /* print image properties */
  432.    _16_c_show(-1, -1, image_c[0], COPY_IMAGE);   /* show the original image     */
  433.    _16_c_show(-1, -1, image_c[1], COPY_IMAGE);   /* now show the copied image   */
  434.                   /* this demonstrates the usage of "-1" for the "x" value  */
  435.  
  436.    _16_c_show(190, 150, image_c[2], COPY_IMAGE); /* show the original image     */
  437.    _16_c_show(280, 150, image_c[3], COPY_IMAGE); /* now show the copied image   */
  438.                   /* this demonstrates the usage of inputting the "x" value */
  439.  
  440.    _16_p_show(10, 250, image_p[0], COPY_IMAGE);  /* show the original image     */
  441.    _16_p_show(100, 250, image_p[1], COPY_IMAGE); /* now show the copied image   */
  442.    _16_i_show(10, 350, image_i[0], COPY_IMAGE);  /* show the original image */
  443.    _16_i_show(100, 350, image_i[1], COPY_IMAGE); /* now show copied image   */
  444.  
  445.    PRINT(10, MAXY-25, message);              /* print a message             */
  446.    str_copy(&message[0], "images and their properties are shown -- press any \
  447. key to return to DOS");                      /* copy "image_cmnd"           */
  448.      /*** the '\' character allow a string to be continued on the next line */
  449.    PRINT(10, MAXY-25, message);              /* print "message"             */
  450.    locations[7][0] = 10, locations[7][1] = MAXY-25,
  451.    locations[7][2] = textwidth(message);     /* save text data              */
  452.  
  453.    getchr();                                 /* wait for a key press        */
  454.    erase_text(locations, 9);               /* restore background under text */
  455. }
  456.  
  457. /*----------------------------------------------------------------------------
  458.  * Convert an integer into either the string "TRUE" or the string "FALSE".
  459.  *
  460.  * "boolean" - integer to check
  461.  *
  462.  * RETURNS:
  463.  * = "TRUE"  if "boolean" is not equal to 0
  464.  * = "FALSE" if "boolean" is equal to 0
  465.  */
  466. char *t_or_f(int boolean)
  467. {
  468.    if (boolean) return("TRUE");
  469.    else return("FALSE");
  470. }
  471.  
  472. /*==========================================================================*/
  473.  
  474. // REALiTY
  475.